home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / g_quake / dmmde321.zip / WIZARD.QC < prev    next >
Text File  |  1996-08-16  |  12KB  |  449 lines

  1. /*
  2. ==============================================================================
  3.  
  4. WIZARD
  5.  
  6. ==============================================================================
  7. */
  8.  
  9. $cd /raid/quake/id1/models/a_wizard
  10. $origin 0 0 24
  11. $base wizbase    
  12. $skin wizbase
  13.  
  14. $frame hover1 hover2 hover3 hover4 hover5 hover6 hover7 hover8
  15. $frame hover9 hover10 hover11 hover12 hover13 hover14 hover15
  16.  
  17. $frame fly1 fly2 fly3 fly4 fly5 fly6 fly7 fly8 fly9 fly10
  18. $frame fly11 fly12 fly13 fly14
  19.  
  20. $frame magatt1 magatt2 magatt3 magatt4 magatt5 magatt6 magatt7
  21. $frame magatt8 magatt9 magatt10 magatt11 magatt12 magatt13
  22.  
  23. $frame pain1 pain2 pain3 pain4
  24.  
  25. $frame death1 death2 death3 death4 death5 death6 death7 death8
  26.  
  27. void() wizard_respawn;
  28.  
  29. /*
  30. ==============================================================================
  31.  
  32. WIZARD
  33.  
  34. If the player moves behind cover before the missile is launched, launch it
  35. at the last visible spot with no velocity leading, in hopes that the player
  36. will duck back out and catch it.
  37. ==============================================================================
  38. */
  39.  
  40. /*
  41. =============
  42. LaunchMissile
  43.  
  44. Sets the given entities velocity and angles so that it will hit self.enemy
  45. if self.enemy maintains it's current velocity
  46. 0.1 is moderately accurate, 0.0 is totally accurate
  47. =============
  48. */
  49. void(entity missile, float mspeed, float accuracy) LaunchMissile =
  50. {
  51.     local    vector    vec, move;
  52.     local    float    fly;
  53.  
  54.     makevectors (self.angles);
  55.         
  56. // set missile speed
  57.     vec = self.enemy.origin + self.enemy.mins + self.enemy.size * 0.7 - missile.origin;
  58.  
  59. // calc aproximate time for missile to reach vec
  60.     fly = vlen (vec) / mspeed;
  61.     
  62. // get the entities xy velocity
  63.     move = self.enemy.velocity;
  64.     move_z = 0;
  65.  
  66. // project the target forward in time
  67.     vec = vec + move * fly;
  68.     
  69.     vec = normalize(vec);
  70.     vec = vec + accuracy*v_up*(random()- 0.5) + accuracy*v_right*(random()- 0.5);
  71.     
  72.     missile.velocity = vec * mspeed;
  73.  
  74.     missile.angles = '0 0 0';
  75.     missile.angles_y = vectoyaw(missile.velocity);
  76.  
  77. // set missile duration
  78.     missile.nextthink = time + 5;
  79.     missile.think = SUB_Remove;    
  80. };
  81.  
  82.  
  83. void() wiz_run1;
  84. void() wiz_side1;
  85.  
  86. /*
  87. =================
  88. WizardCheckAttack
  89. =================
  90. */
  91. float()    WizardCheckAttack =
  92. {
  93.     local vector    spot1, spot2;    
  94.     local entity    targ;
  95.     local float        chance;
  96.  
  97.     if (time < self.attack_finished)
  98.         return FALSE;
  99.     if (!enemy_vis)
  100.         return FALSE;
  101.  
  102.     if (enemy_range == RANGE_FAR)
  103.     {
  104.         if (self.attack_state != AS_STRAIGHT)
  105.         {
  106.             self.attack_state = AS_STRAIGHT;
  107.             wiz_run1 ();
  108.         }
  109.         return FALSE;
  110.     }
  111.         
  112.     targ = self.enemy;
  113.     
  114. // see if any entities are in the way of the shot
  115.     spot1 = self.origin + self.view_ofs;
  116.     spot2 = targ.origin + targ.view_ofs;
  117.  
  118.     traceline (spot1, spot2, FALSE, self);
  119.  
  120.     if (trace_ent != targ)
  121.     {    // don't have a clear shot, so move to a side
  122.         if (self.attack_state != AS_STRAIGHT)
  123.         {
  124.             self.attack_state = AS_STRAIGHT;
  125.             wiz_run1 ();
  126.         }
  127.         return FALSE;
  128.     }
  129.             
  130.     if (enemy_range == RANGE_MELEE)
  131.         chance = 0.9;
  132.     else if (enemy_range == RANGE_NEAR)
  133.         chance = 0.6;
  134.     else if (enemy_range == RANGE_MID)
  135.         chance = 0.2;
  136.     else
  137.         chance = 0;
  138.  
  139.     if (random () < chance)
  140.     {
  141.         self.attack_state = AS_MISSILE;
  142.         return TRUE;
  143.     }
  144.  
  145.     if (enemy_range == RANGE_MID)
  146.     {
  147.         if (self.attack_state != AS_STRAIGHT)
  148.         {
  149.             self.attack_state = AS_STRAIGHT;
  150.             wiz_run1 ();
  151.         }
  152.     }
  153.     else
  154.     {
  155.         if (self.attack_state != AS_SLIDING)
  156.         {
  157.             self.attack_state = AS_SLIDING;
  158.             wiz_side1 ();
  159.         }
  160.     }
  161.     
  162.     return FALSE;
  163. };
  164.  
  165. /*
  166. =================
  167. WizardAttackFinished
  168. =================
  169. */
  170. float()    WizardAttackFinished =
  171. {
  172.     if (enemy_range >= RANGE_MID || !enemy_vis)
  173.     {
  174.         self.attack_state = AS_STRAIGHT;
  175.         self.think = wiz_run1;
  176.     }
  177.     else
  178.     {
  179.         self.attack_state = AS_SLIDING;
  180.         self.think = wiz_side1;
  181.     }
  182. };
  183.  
  184. /*
  185. ==============================================================================
  186.  
  187. FAST ATTACKS
  188.  
  189. ==============================================================================
  190. */
  191.  
  192. void() Wiz_FastFire =
  193. {
  194.     local vector        vec;
  195.     local vector        dst;
  196.  
  197.     if (self.owner.health > 0)
  198.     {
  199.         self.owner.effects = self.owner.effects | EF_MUZZLEFLASH;
  200.  
  201.         makevectors (self.enemy.angles);    
  202.         dst = self.enemy.origin - 13*self.movedir;
  203.     
  204.         vec = normalize(dst - self.origin);
  205.         sound (self, CHAN_WEAPON, "wizard/wattack.wav", 1, ATTN_NORM);
  206.         launch_spike (self.origin, vec);
  207.         newmis.velocity = vec*600;
  208.         newmis.owner = self.owner;
  209.         newmis.classname = "wizspike";
  210.         setmodel (newmis, "progs/w_spike.mdl");
  211.         setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);        
  212.     }
  213.  
  214.     remove (self);
  215. };
  216.  
  217.  
  218. void() Wiz_StartFast =
  219. {
  220.     local    entity    missile;
  221.     
  222.     sound (self, CHAN_WEAPON, "wizard/wattack.wav", 1, ATTN_NORM);
  223.     self.v_angle = self.angles;
  224.     makevectors (self.angles);
  225.  
  226.     missile = spawn ();
  227.     missile.owner = self;
  228.     missile.nextthink = time + 0.6;
  229.     setsize (missile, '0 0 0', '0 0 0');        
  230.     setorigin (missile, self.origin + '0 0 30' + v_forward*14 + v_right*14);
  231.     missile.enemy = self.enemy;
  232.     missile.nextthink = time + 0.8;
  233.     missile.think = Wiz_FastFire;
  234.     missile.movedir = v_right;
  235.  
  236.     missile = spawn ();
  237.     missile.owner = self;
  238.     missile.nextthink = time + 1;
  239.     setsize (missile, '0 0 0', '0 0 0');        
  240.     setorigin (missile, self.origin + '0 0 30' + v_forward*14 + v_right* -14);
  241.     missile.enemy = self.enemy;
  242.     missile.nextthink = time + 0.3;
  243.     missile.think = Wiz_FastFire;
  244.     missile.movedir = VEC_ORIGIN - v_right;
  245. };
  246.  
  247.  
  248.  
  249. void() Wiz_idlesound =
  250. {
  251. local float wr;
  252.     wr = random() * 5;
  253.  
  254.     if (self.waitmin < time)
  255.     {
  256.          self.waitmin = time + 2;
  257.          if (wr > 4.5) 
  258.              sound (self, CHAN_VOICE, "wizard/widle1.wav", 1,  ATTN_IDLE);
  259.          if (wr < 1.5)
  260.              sound (self, CHAN_VOICE, "wizard/widle2.wav", 1, ATTN_IDLE);
  261.     }
  262.     return;
  263. };
  264.  
  265. void()    wiz_stand1    =[    $hover1,        wiz_stand2    ] {ai_stand();};
  266. void()    wiz_stand2    =[    $hover2,        wiz_stand3    ] {ai_stand();};
  267. void()    wiz_stand3    =[    $hover3,        wiz_stand4    ] {ai_stand();};
  268. void()    wiz_stand4    =[    $hover4,        wiz_stand5    ] {ai_stand();};
  269. void()    wiz_stand5    =[    $hover5,        wiz_stand6    ] {ai_stand();};
  270. void()    wiz_stand6    =[    $hover6,        wiz_stand7    ] {ai_stand();};
  271. void()    wiz_stand7    =[    $hover7,        wiz_stand8    ] {ai_stand();};
  272. void()    wiz_stand8    =[    $hover8,        wiz_stand1    ] {ai_stand();};
  273.  
  274. void()    wiz_walk1    =[    $hover1,        wiz_walk2    ] {ai_walk(8);
  275. Wiz_idlesound();};
  276. void()    wiz_walk2    =[    $hover2,        wiz_walk3    ] {ai_walk(8);};
  277. void()    wiz_walk3    =[    $hover3,        wiz_walk4    ] {ai_walk(8);};
  278. void()    wiz_walk4    =[    $hover4,        wiz_walk5    ] {ai_walk(8);};
  279. void()    wiz_walk5    =[    $hover5,        wiz_walk6    ] {ai_walk(8);};
  280. void()    wiz_walk6    =[    $hover6,        wiz_walk7    ] {ai_walk(8);};
  281. void()    wiz_walk7    =[    $hover7,        wiz_walk8    ] {ai_walk(8);};
  282. void()    wiz_walk8    =[    $hover8,        wiz_walk1    ] {ai_walk(8);};
  283.  
  284. void()    wiz_side1    =[    $hover1,        wiz_side2    ] {ai_run(8);
  285. Wiz_idlesound();};
  286. void()    wiz_side2    =[    $hover2,        wiz_side3    ] {ai_run(8);};
  287. void()    wiz_side3    =[    $hover3,        wiz_side4    ] {ai_run(8);};
  288. void()    wiz_side4    =[    $hover4,        wiz_side5    ] {ai_run(8);};
  289. void()    wiz_side5    =[    $hover5,        wiz_side6    ] {ai_run(8);};
  290. void()    wiz_side6    =[    $hover6,        wiz_side7    ] {ai_run(8);};
  291. void()    wiz_side7    =[    $hover7,        wiz_side8    ] {ai_run(8);};
  292. void()    wiz_side8    =[    $hover8,        wiz_side1    ] {ai_run(8);};
  293.  
  294. void()    wiz_run1    =[    $fly1,        wiz_run2    ] {ai_run(16);
  295. Wiz_idlesound();
  296. };
  297. void()    wiz_run2    =[    $fly2,        wiz_run3    ] {ai_run(16);};
  298. void()    wiz_run3    =[    $fly3,        wiz_run4    ] {ai_run(16);};
  299. void()    wiz_run4    =[    $fly4,        wiz_run5    ] {ai_run(16);};
  300. void()    wiz_run5    =[    $fly5,        wiz_run6    ] {ai_run(16);};
  301. void()    wiz_run6    =[    $fly6,        wiz_run7    ] {ai_run(16);};
  302. void()    wiz_run7    =[    $fly7,        wiz_run8    ] {ai_run(16);};
  303. void()    wiz_run8    =[    $fly8,        wiz_run9    ] {ai_run(16);};
  304. void()    wiz_run9    =[    $fly9,        wiz_run10    ] {ai_run(16);};
  305. void()    wiz_run10    =[    $fly10,        wiz_run11    ] {ai_run(16);};
  306. void()    wiz_run11    =[    $fly11,        wiz_run12    ] {ai_run(16);};
  307. void()    wiz_run12    =[    $fly12,        wiz_run13    ] {ai_run(16);};
  308. void()    wiz_run13    =[    $fly13,        wiz_run14    ] {ai_run(16);};
  309. void()    wiz_run14    =[    $fly14,        wiz_run1    ] {ai_run(16);};
  310.  
  311. void()    wiz_fast1    =[    $magatt1,        wiz_fast2    ] {ai_face();Wiz_StartFast();};
  312. void()    wiz_fast2    =[    $magatt2,        wiz_fast3    ] {ai_face();};
  313. void()    wiz_fast3    =[    $magatt3,        wiz_fast4    ] {ai_face();};
  314. void()    wiz_fast4    =[    $magatt4,        wiz_fast5    ] {ai_face();};
  315. void()    wiz_fast5    =[    $magatt5,        wiz_fast6    ] {ai_face();};
  316. void()    wiz_fast6    =[    $magatt6,        wiz_fast7    ] {ai_face();};
  317. void()    wiz_fast7    =[    $magatt5,        wiz_fast8    ] {ai_face();};
  318. void()    wiz_fast8    =[    $magatt4,        wiz_fast9    ] {ai_face();};
  319. void()    wiz_fast9    =[    $magatt3,        wiz_fast10    ] {ai_face();};
  320. void()    wiz_fast10    =[    $magatt2,        wiz_run1    ] {ai_face();SUB_AttackFinished(2);WizardAttackFinished ();};
  321.  
  322. void()    wiz_pain1    =[    $pain1,        wiz_pain2    ] {};
  323. void()    wiz_pain2    =[    $pain2,        wiz_pain3    ] {};
  324. void()    wiz_pain3    =[    $pain3,        wiz_pain4    ] {};
  325. void()    wiz_pain4    =[    $pain4,        wiz_run1    ] {};
  326.  
  327. void()    wiz_death1    =[    $death1,        wiz_death2    ] {
  328.  
  329. self.velocity_x = -200 + 400*random();
  330. self.velocity_y = -200 + 400*random();
  331. self.velocity_z = 100 + 100*random();
  332. self.flags = self.flags - (self.flags & FL_ONGROUND);
  333. sound (self, CHAN_VOICE, "wizard/wdeath.wav", 1, ATTN_NORM);
  334. };
  335. void()    wiz_death2    =[    $death2,        wiz_death3    ] {};
  336. void()    wiz_death3    =[    $death3,        wiz_death4    ]{self.solid = SOLID_NOT;};
  337. void()    wiz_death4    =[    $death4,        wiz_death5    ] {};
  338. void()    wiz_death5    =[    $death5,        wiz_death6    ] {};
  339. void()    wiz_death6    =[    $death6,        wiz_death7    ] {};
  340. void()    wiz_death7    =[    $death7,        wiz_death8    ] {};
  341. void()    wiz_death8    =[    $death8,        wiz_death8    ] {
  342.         if (deathmatch > 4)
  343.         {
  344.                 self.think = wizard_respawn;
  345.                 self.nextthink = time + 30;
  346.         }
  347. };
  348.  
  349. void() wiz_die =
  350. {
  351. // check for gib
  352.     if (self.health < -40)
  353.     {
  354.         sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NORM);
  355.         ThrowHead ("progs/h_wizard.mdl", self.health);
  356.         ThrowGib ("progs/gib2.mdl", self.health);
  357.         ThrowGib ("progs/gib2.mdl", self.health);
  358.         ThrowGib ("progs/gib2.mdl", self.health);
  359.  
  360.                 if ((deathmatch == 6) || (deathmatch == 7))
  361.                 {
  362.                         self.think = wizard_respawn;
  363.                         self.nextthink = time + 30;
  364.                 }
  365.         return;
  366.     }
  367.  
  368.     wiz_death1 ();
  369. };
  370.  
  371.  
  372. void(entity attacker, float damage) Wiz_Pain =
  373. {
  374.     sound (self, CHAN_VOICE, "wizard/wpain.wav", 1, ATTN_NORM);
  375.     if (random()*70 > damage)
  376.         return;        // didn't flinch
  377.  
  378.     wiz_pain1 ();
  379. };
  380.  
  381.  
  382. void() Wiz_Missile =
  383. {
  384.     wiz_fast1();
  385. };
  386.  
  387. /*QUAKED monster_wizard (1 0 0) (-16 -16 -24) (16 16 40) Ambush
  388. */
  389. void() monster_wizard =
  390. {
  391.         if ((deathmatch) && (deathmatch < 4))
  392.     {
  393.         remove(self);
  394.         return;
  395.     }
  396.     precache_model ("progs/wizard.mdl");
  397.     precache_model ("progs/h_wizard.mdl");
  398.     precache_model ("progs/w_spike.mdl");
  399.  
  400.     precache_sound ("wizard/hit.wav");        // used by c code
  401.     precache_sound ("wizard/wattack.wav");
  402.     precache_sound ("wizard/wdeath.wav");
  403.     precache_sound ("wizard/widle1.wav");
  404.     precache_sound ("wizard/widle2.wav");
  405.     precache_sound ("wizard/wpain.wav");
  406.     precache_sound ("wizard/wsight.wav");
  407.  
  408.     self.solid = SOLID_SLIDEBOX;
  409.     self.movetype = MOVETYPE_STEP;
  410.  
  411.     setmodel (self, "progs/wizard.mdl");
  412.  
  413.         self.mdl = self.model;
  414.         self.oldorigin = self.origin;
  415.  
  416.     setsize (self, '-16 -16 -24', '16 16 40');
  417.     self.health = 80;
  418.  
  419.     self.th_stand = wiz_stand1;
  420.     self.th_walk = wiz_walk1;
  421.     self.th_run = wiz_run1;
  422.     self.th_missile = Wiz_Missile;
  423.     self.th_pain = Wiz_Pain;
  424.     self.th_die = wiz_die;
  425.         
  426.     flymonster_start ();
  427. };
  428.  
  429. void() wizard_respawn =
  430. {
  431.         spawn_tfog(self.origin);
  432.         spawn_tfog(self.oldorigin);
  433.         spawn_tdeath(self.oldorigin, self);
  434.     setmodel (self, "progs/wizard.mdl");
  435.         self.movetype = MOVETYPE_STEP;
  436.         self.solid = SOLID_SLIDEBOX;
  437.     self.health = 80;
  438.     setsize (self, '-16 -16 -24', '16 16 40');
  439.         setorigin (self, self.oldorigin);
  440.     self.th_stand = wiz_stand1;
  441.     self.th_walk = wiz_walk1;
  442.     self.th_run = wiz_run1;
  443.     self.th_missile = Wiz_Missile;
  444.     self.th_pain = Wiz_Pain;
  445.     self.th_die = wiz_die;
  446.         flymonster_start ();
  447. };
  448.  
  449.